package com.prothink.threadproject.config;
import com.prothink.threadproject.interceptor.CorsInterceptor;
import com.prothink.threadproject.interceptor.JWTTokenInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;
import java.util.List;

/**
 * @author mayanping
 * @title: InterceptorConfig
 * @projectName ThreadAdminDemo
 * @description: TODO
 * @date 2024/9/509:04
 *
 * CorsInterceptor：处理跨域请求，应用于所有路径。
 * JWTTokenInterceptor：验证JWT令牌，应用于所有路径，
 *      但排除了与用户注册、登录等相关的白名单路径。
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    //定义集合
    private static List<String> whiteList = new ArrayList<>();

    //加载类时将以下URL路径添加到集合中
    static {
        whiteList.add("/login/register");
        whiteList.add("/login/login");
        whiteList.add("/login/resetPwd");
        whiteList.add("/user/validChaptcha");
        whiteList.add("/login/validUserAccount");
        whiteList.add("/user/v2/chaptcha");
        whiteList.add("/api/evaluatePasswordStrength");
    }

    //处理跨域请求,允许不同源的客户端访问资源
    @Bean
    CorsInterceptor corsInterceptor(){
        return new CorsInterceptor();
    }


    /**
     * 配置跨域请求拦截器 对所有路径拦截
     * 配置JWTToken拦截器 对所以路径进行拦截 排除白名单中的路径
     * 调用父类方法完成额外的拦截器注册
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /**
         * 拦截全部路径，这个跨域需要放在最上面
         */
        registry.addInterceptor(corsInterceptor()).addPathPatterns("/**");

        //登陆拦截器
        registry.addInterceptor(new JWTTokenInterceptor())
                .addPathPatterns("/user")
                .addPathPatterns("/login/login")
                .excludePathPatterns(whiteList);

        WebMvcConfigurer.super.addInterceptors(registry);
    }
}
